<?php
abstract class Mozg_Layout
{
    protected $_template = 'default';

    protected $_detector;

    public function __construct ()
    {
		$this->_detector = new Mozg_Detector($this);
    }

    protected function GetTpl($name = '')
    {
    	foreach ($this->_detector as $component)
    	{
    		try
    		{
    			return Mozg::Tpl($name, $component[0], $component[1], $this->_detector);
    		}
    		catch (Exception $e)
    		{

    		}
    	}

    	throw new Mozg_Exception_NotFound(Mozg_Lang::_('Template ' .$name. ' not found in %s', get_class($this)));
    }

    /**
		запускаем декоратор, т.е. выполняем выплняем установленный метод этого класса
     */
    public function Run ()
    {
        $methodName = $this->_template . 'Tmp';
        $this->CheckTemplate($this->_template);
        $this->$methodName();
        return $this;
    }

    /**
		возвращает текущий шаблон
     */
    public function GetTemplate ()
    {
        return $this->_template;
    }

    /**
		устанавливает шаблон
     */
    public function SetTemplate ($tmpName)
    {
        $this->CheckTemplate($tmpName);
        $this->_template = $tmpName;
        return $this;
    }
    protected function CheckTemplate($tmpName)
    {
        if (! method_exists($this, $tmpName. 'Tmp'))
            throw new Mozg_Exception_NotFound(Mozg_Lang::_('TEMPLATE_%_NOT_FOUND', $tmpName));
    }

    ########################################################

    /**
		Все методы шаблонов должны оканчиваться на Tmp
     */
    protected function DefaultTmp ()
    {}

    ########################################################

    /**
		шаблон json
     */
    protected function JsonTmp ()
    {
        $this->SetDefaultHeaders();
        Mozg::Response('http')->SetHeader('Content-Type', 'application/javascript; charset=UTF-8');

        $x = new stdClass();
        $x->messages = Mozg::Lib('messanger')->getAllMessages();
        $x->status = Mozg::Response('http')->GetStatus();
        $x->data = Mozg::Response('http')->GetBody();
        $x->js = implode('', Mozg::SubAction()->Get('RequiredJS'));

        Mozg::Response('http')->SetBody(Mozg::Lib('Json')->Encode($x));
    }

    protected function SimpleJsonTmp()
    {
        $this->SetDefaultHeaders();
        Mozg::Response('http')->SetHeader('Content-Type', 'application/javascript; charset=UTF-8');
        $cont = Mozg::Response('http')->GetBody();
        Mozg::Response('http')->SetBody($cont);
    }

    protected function SimpleTmp()
    {
        $this->SetDefaultHeaders();
        Mozg::Response('http')->SetHeader('Content-Type', 'text/html; charset=UTF-8');
    }

	/**
	 * шаблон xml
	 */
    protected function XmlTmp ()
    {
        $this->SetDefaultHeaders();
        Mozg::Response('http')->SetHeader('Content-Type', 'text/xml; charset=UTF-8');

        $cont  = '<?xml version="1.0" encoding="utf-8"?>' . "\n";
        $cont .= Mozg::Response('http')->GetBody();
        Mozg::Response('http')->SetBody($cont);
    }

    protected function SetDefaultHeaders()
    {
        Mozg::Response('http')->SetHeader('X-Author', 'Nick Zmachynski');
        Mozg::Response('http')->SetHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0', true);
        Mozg::Response('http')->SetHeader('Pragma', 'no-cache', true);
        Mozg::Response('http')->SetHeader('Expires', gmdate('D, d M Y H:i:s', time() - 1000) . ' GMT', true);
    }

    /**
		шаблон std
     */
    protected function StdTmp ()
    {

    }
}